﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include "GcmpModel.h"
#include "GcmpApiDeclaration.h"

namespace gcmp
{
    class IDocument;
    class IElement;
    class IElementCut;

    /// \brief 扣减工具类
    class GCMP_MODEL_EXPORT CutUtils
    {
    public:     

        /// \brief 判断两个元素的图形表达是否能够扣减
        ///
        /// 扣减对象获取几何关系组件为空时会返回false
        /// 如果被扣减对象都是Instance,当不使用打洞进行操作时，会通过扣减对象的扣减Grep(获取扣减组件或扣减grep为空时返回false)与被扣减对象的baseGRep或ModelGRep进行是否相交来判断是否可以进行扣减
        /// 如果被扣减对象都是Instance,当使用打洞进行操作时，会通过扣减对象的打洞的grep（获取打洞grep为空时返回false）与被扣减对象的baseGRep或ModelGRep进行是否相交来判断是否可以进行扣减
        /// 如果被扣减对象不是Instance，会用扣减对象的扣减grep与被扣减对象的ModelGRep进行是否相交来判断是否可以进行扣减
        /// \param pDocument 当前文档
        /// \param pCutter 扣减对象
        /// \param pCuttee 被扣减对象
        /// \param useOpeningGraphicsShapeToCut 是否使用打洞grep进行扣减操作，该参数只对pCuttee是Instance才生效
        /// \return bool 能够扣减返回true，否则返回false
        static bool IsGraphicsShapeIntersect(const IDocument *pDocment, const IElement *pCutter, const IElement *pCuttee, bool useOpeningGraphicsShapeToCut = false);

        /// \brief 如果不允许扣减，通过ElementCutId删除ElementCut
        /// \param pDocument 当前文档
        /// \param elementCutId 扣减关系对象的Id
        /// \return bool 删除成功返回true，否则返回false
        static bool DeleteElementCutIfNotAllowCutByElementCutId(IDocument* pDoc, const ElementId &elementCutId);

        /// \brief 如果不允许扣减，通过扣减或被扣减对象Id删除ElementCut
        /// \param pDocument 当前文档
        /// \param cutterOrCutteeId 扣减或被扣减对象Id
        /// \return bool 删除成功返回true，否则返回false
        static bool DeleteElementCutsIfNotAllowCutByCutterOrCutteeId(IDocument* pDoc, const ElementId &cutterOrCutteeId);

        /// \brief 建立Element间的扣减关系
        /// \param pDocument 当前文档
        /// \param cutterId 扣减对象Id
        /// \param cutteeId 被扣减对象的Id
        /// \return 扣减关系对象
        GCMP_OBSOLETE_API(2020/10/01, IElementCut::Create(IDocument * pDoc, const ElementId & cuttingId, const ElementId & cuttedId, bool useOpeningGraphicsShapeToCut = false))
        static IElementCut* BuildElementCutRelationship(IDocument* pDocument, const ElementId &cutterId, const ElementId &cutteeId);

        /// \brief 建立Element间的扣减关系
        /// \param pDocument 当前文档
        /// \param cutterId 扣减对象
        /// \param cutteeId 被扣减对象
        /// \return 扣减关系对象
        GCMP_OBSOLETE_API(2020/10/01, IElementCut::Create(IDocument * pDoc, const ElementId & cuttingId, const ElementId & cuttedId, bool useOpeningGraphicsShapeToCut = false))
        static IElementCut* BuildElementCutRelationship(IDocument* pDocument, IElement *pCutter, IElement *pCuttee);
    };
}

